//原文链接：
//@https://blog.csdn.net/ITSOK_123/article/details/124451690

//if判断
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> expr;
        int nums=0;
        for(string c:tokens){
            //如果是运算符就从栈取出两个数字来求值
            //注意运算顺序
            if(c=="+"||c=="-"||c=="*"||c=="/"){
                int a=expr.top();
                expr.pop();
                int b=expr.top();
                expr.pop();
                if(c=="+") expr.push(b+a);
                if(c=="-") expr.push(b-a);
                if(c=="*") expr.push(b*a);
                if(c=="/") expr.push(b/a);
            }
            //如果是数字就压入栈,因为限定输入为表达式所以本题输入简单
            //只有数字和运算符，而且没有括号
            //所以避免了一些判栈空的操作
            else{
                expr.push(stoi(c));
            }
        }
        return expr.top();
    }
};

//switch选择：
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> stk;
        int n = tokens.size();
        for (int i = 0; i < n; i++) {
            string& token = tokens[i];
            if (isNumber(token)) {
                stk.push(atoi(token.c_str()));
            } else {
                int num2 = stk.top();
                stk.pop();
                int num1 = stk.top();
                stk.pop();
                switch (token[0]) {
                    case '+':
                        stk.push(num1 + num2);
                        break;
                    case '-':
                        stk.push(num1 - num2);
                        break;
                    case '*':
                        stk.push(num1 * num2);
                        break;
                    case '/':
                        stk.push(num1 / num2);
                        break;
                }
            }
        }
        return stk.top();
    }

    bool isNumber(string& token) {
        return !(token == "+" || token == "-" || token == "*" || token == "/");
    }
};

